package interfacciaGrafica;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;

import controllori.ControllorePcMouse;
import controllori.ControllorePcSenzaMouse;
import elementi.Elemento;
import elementi.ElementoMobile;
import elementi.Energia;
import elementi.Muro;
import elementi.Scudo;
import elementi.giocatori.Giocatore;
import gioco.Arena;
import gioco.ElementiFactory;
import gioco.FactoryProxy;
import gioco.FormeFactory;
import gioco.GestoreCampo;
import gioco.GestoreControllori;
import gioco.GiocatoriDaPcException;
import grafica.GraficaProxy;
import grafica.GraficaSemplice;



public class GraficaMenu extends JFrame {
	
	private static final long serialVersionUID = 1L;
	
	private final String[] sceltaNumAvversari = {"1","2","3","4","5","6","7","8"};;
	private final String[] sceltaPersonaggi = {"FastBot","BomboBot","BioBot","TechnoBot"};
	private final String[] sceltaNumGiocatori = {"1","2"};

	int altezzaCampo, larghezzaCampo;
	
	JButton avvia;
	JComboBox boxAvversari;
	JComboBox boxGiocatori;
	JComboBox boxPersonaggi1;
	JComboBox boxPersonaggi2;

	
	LinkedList<Elemento> elementi;
	LinkedList<ElementoMobile> elementiMobili;

	GestoreCampo gestoreCampo;
	GestoreControllori gestoreControllori;
	
	String [] tipoGiocatoriPc = new String [2];
	int [] tipoGiocatori = new int [3];
	
	public GraficaMenu() {
				
		setTitle("Menu di Gioco");
		
		//grafica di test! Prevista gestione schermo intero nella prossima gara.
		altezzaCampo = 600;
		larghezzaCampo = 800;
		
		FactoryProxy.setFactoryElementi(new ElementiFactory());
		FactoryProxy.setFactoryForme(new FormeFactory());
		
		avvia = new JButton();
		boxAvversari = new JComboBox(sceltaNumAvversari);
		boxGiocatori = new JComboBox(sceltaNumGiocatori);
		
		boxGiocatori.addActionListener( new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (new Integer (boxGiocatori.getSelectedItem().toString()) == 1) {
					boxPersonaggi2.setVisible(false);
					pack();
				} else {
					boxPersonaggi2.setVisible(true);
					pack();
				}
			}
		});
		
		tipoGiocatoriPc[0] = "Non definito";
		tipoGiocatoriPc[1] = "Non definito";
		boxPersonaggi1 = new JComboBox(sceltaPersonaggi);
		boxPersonaggi1.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				tipoGiocatoriPc	[0] = boxPersonaggi1.getSelectedItem().toString();	
			}
		});
		boxPersonaggi2 = new JComboBox(sceltaPersonaggi);
		boxPersonaggi2.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				tipoGiocatoriPc	[1] = boxPersonaggi2.getSelectedItem().toString();			
			}
		});
		boxPersonaggi1.setVisible(true);
		boxPersonaggi2.setVisible(false);
		
		elementi = new LinkedList<Elemento>();
		elementiMobili = new LinkedList<ElementoMobile>();
		
		
		this.setLayout(new FlowLayout());
		avvia.setText("Avvia Gioco");
		avvia.getPreferredSize();
		this.add(new JLabel("Numero Giocatori"));
		this.add(boxGiocatori);
		this.add(new JLabel("Personaggio"));
		this.add(boxPersonaggi1);
		this.add(boxPersonaggi2);
		this.add(new JLabel("Numero Avversari"));
		this.add(boxAvversari);
		this.add(avvia);


		avvia.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				
				tipoGiocatori[0] = new Integer(boxGiocatori.getSelectedItem().toString()).intValue();
				tipoGiocatori[1]= 0;
				tipoGiocatori[2]= 0;
				
				gestoreControllori = new GestoreControllori();
				gestoreCampo = new GestoreCampo(larghezzaCampo, altezzaCampo, tipoGiocatori, tipoGiocatoriPc);
				gestoreCampo.resetGriglia();
				elementi.clear();
				elementiMobili.clear();
				LinkedList<Muro> muri = gestoreCampo.creaMuri();
				LinkedList<Giocatore> giocatori = gestoreCampo.creaGiocatori();
				LinkedList<Scudo> scudi = gestoreCampo.creaScudi();
				LinkedList<Energia> energie = gestoreCampo.creaEnergie();
				
				try {
					gestoreControllori.aggiungiControllori(tipoGiocatori, giocatori);
				} catch (GiocatoriDaPcException ecc) {
					ecc.printStackTrace();
				}
				
				
				elementi.addAll(giocatori);
				elementi.addAll(muri);
				elementi.addAll(scudi);
				elementi.addAll(energie);
				elementiMobili.addAll(giocatori);
				
				GraficaProxy.getSingleton().setGrafica(new GraficaSemplice (Arena.getArena()));

				Arena.getArena().inizia(elementiMobili, elementi, larghezzaCampo, altezzaCampo);
				
				
				JFrame pannelloGioco = new JFrame();
				pannelloGioco.getContentPane().add((GraficaSemplice)GraficaProxy.getSingleton().getGrafica());
				pannelloGioco.setVisible(true);
				pannelloGioco.setSize (larghezzaCampo+8, altezzaCampo+28);
				pannelloGioco.setResizable(false);
				pannelloGioco.setName("DartBall");
				
			
				Iterator<ControllorePcMouse> itco = gestoreControllori.getControlloriPcMouse().iterator();
				while(itco.hasNext()) {
					ControllorePcMouse cpcit= itco.next();
					pannelloGioco.addKeyListener(cpcit);
					pannelloGioco.addMouseMotionListener(cpcit);
					pannelloGioco.addMouseListener(cpcit);
				}
				
				Iterator<ControllorePcSenzaMouse> itcosm= gestoreControllori.getControlloriPcSenzaMouse().iterator();
				while(itcosm.hasNext()) {
					pannelloGioco.addKeyListener(itcosm.next());

				}
			}

		});		

		pack();
		
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
}